// echo aux function only, should not compile alone.
// cp Utils.CS .. && cd $_ && for i in `\ls` ; do \cp -f Utils.CS $i/ ; done ; rm Utils.CS && cd "$OLDPWD"
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Collections.Generic;
using HarmonyLib;
using static Utils.Logger;
namespace Utils {
    public static class Parser {
        public static bool Name2Id<T,U>(string trickstr,U config, ref T type, string Name="Name",string TemplateId="TemplateId") where U:IEnumerable<object> {
            var id=trickstr.Trim();
            var t=id.Split('+');
            var cnt=0;
            if(t.Length>1){
                cnt=int.Parse(t[1]);
            }
            id=t[0];
            bool modified=false;
            try{
                type=(T)(typeof(T).GetMethod("Parse").Invoke(null,new object[]{id}));
                modified=true;
            } catch {
                bool first=true;
                FieldInfo name=null;
                FieldInfo code=null;
                foreach(var x in config){
                    if(first){
                        name=x.GetType().GetField(Name);
                        code=x.GetType().GetField(TemplateId);
                        if(name==null || code==null){
                            logwarn($"{x.GetType()} -- {Name}:{name} 或者 {TemplateId}:{code} 是 null，请联系中子处理这个错误。");
                            break;
                        }
                        if(code.FieldType!=typeof(T)){
                            logwarn($"code.FieldType（{code.FieldType}）与typeof(T)（{typeof(T)}）不一致，请联系中子处理这个错误。");
                            break;
                        }
                        first=false;
                    }
                    if((string)(name.GetValue(x))==id){
                        modified=true;
                        type=(T)(code.GetValue(x));
                        cnt--;
                        if(cnt<0){break;}
                    }
                }
            }
            return modified;
        }
    }
}
